package com.jinxin.platform.cdzxkacs.rpc;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jinxin.platform.base.common.pojo.InvokeCfg;
import com.jinxin.platform.base.common.pojo.JsonResult;
import com.jinxin.platform.base.common.support.BusinessDelegate;
import com.jinxin.platform.cdzxkacs.bean.*;
import com.jinxin.platform.cdzxkacs.bean.bo.ParsedDownResult;
import com.jinxin.platform.cdzxkacs.bean.enums.ResponseCode;
import com.jinxin.platform.cdzxkacs.bean.enums.ResultCode;
import com.jinxin.platform.cdzxkacs.common.Constant;
import com.jinxin.platform.cdzxkacs.common.SysUserVO;
import com.jinxin.platform.cdzxkacs.mapper.CdzxkacsDeviceMapper;
import com.jinxin.platform.cdzxkacs.mapper.CdzxkacsOpenRecordMapper;
import com.jinxin.platform.cdzxkacs.redis.RedisUtil;
import com.jinxin.platform.cdzxkacs.utils.CommonUtil;
import com.jinxin.platform.cdzxkacs.utils.ImageUtils;
import com.jinxin.platform.cdzxkacs.utils.StringUtil;
import com.jinxin.platform.cdzxkacs.utils.URLEncoder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringEscapeUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.*;

import static com.alibaba.fastjson.JSON.toJSONString;

/**
 * @description: (描述...)
 * @return:
 * @author: Linn
 * @time: 2020/05/18
 */
@Component
@Slf4j
public class SysUserRpc {
    @Autowired
    private BusinessDelegate businessDelegate;
    @Autowired
    private CdzxkacsDeviceMapper deviceMapper;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private CdzxkacsOpenRecordMapper openRecordMapper;
    /**
     * 获取当前用户对象
     *
     * @return SysUser
     */
    public SysUserVO getCurrentUser() {
        JsonResult result = getJsonResult(Constant.MODULE_KEY,"getCdzxkacsCurrentUser");
        if (result.getSuccess()) {
            if (result.getData() == null) {
                return null;
            }
            log.info("getCurrentUser:" + result.getData());
            return JSON.parseObject(toJSONString(result.getData()), SysUserVO.class);
        }
//        else {
//            SysUserVO userVO = new SysUserVO();
//            userVO.setUserId("1");
//            userVO.setUserAccount("admin");
//            userVO.setUserName("admin");
//            return userVO;
//        }
        return null;
    }

    public SysUserVO getMgrUserById(String userId) {
        if(StringUtils.isEmpty(userId)){
            return null;
        }
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("getMgrUserById");
        HashMap<String, String> map = new HashMap<>();
        map.put("userId",userId);
        cfg.setArgs(map);
        JsonResult result = businessDelegate.invoke(cfg);
        log.info("getMgrUserById =====>" + result.toString());
        if (result.getSuccess()) {
            if (result.getData() == null) {
                return null;
            }
            return JSON.parseObject(toJSONString(result.getData()), SysUserVO.class);
        }
        return null;
    }

    private JsonResult getJsonResult(String keyName,String funName) {
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(keyName);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName(funName);
        return businessDelegate.invoke(cfg);
    }


    public JsonResult loadCommunityList() {
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("loadCommunityList");
        HashMap<String, String> map = new HashMap<>();
        cfg.setArgs(map);
        JsonResult result = businessDelegate.invoke(cfg);
        log.info("loadCommunityList =====>" + result.toString());
        if(result.getSuccess()){
            return result;
        }
        else {
            List<CommunityInfo> data = new ArrayList<>();
            CommunityInfo c1 = new CommunityInfo("1","小区1");
            CommunityInfo c2 = new CommunityInfo("2","小区2");
            data.add(c1);
            data.add(c2);
            return JsonResult.ok(data);
        }
//        return null;
    }

    public JsonResult loadUserList(String blockId) {
        if(StringUtils.isEmpty(blockId)){
            return JsonResult.error("楼栋id不存在");
        }
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("loadUserList");
        HashMap<String, String> map = new HashMap<>();
        map.put("blockId",blockId);
        cfg.setArgs(map);
        JsonResult result = businessDelegate.invoke(cfg);
        log.info("loadUserList =====>" + result.toString());
        if(result.getSuccess()){
            return result;
        }
//        else {
//            List<CdzxkacsUser> data = new ArrayList<>();
//            CdzxkacsUser u1 = new CdzxkacsUser();
//            u1.setId("1");
//            u1.setName("王麻子");
//            u1.setCertificateType(0);
//            u1.setCertificateNum("123456");
//            u1.setPhone("13456126352");
//            StringBuffer sb = new StringBuffer();
//            sb.append("");
//            sb.append("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");
//            sb.append("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");
//            u1.setFaceData(sb.toString());
//            CdzxkacsUser u2 = new CdzxkacsUser();
//            u2.setId("2");
//            u2.setName("二狗");
//            u2.setCertificateType(1);
//            u2.setCertificateNum("41534545");
//            u2.setPhone("13412634512");
//            data.add(u1);
//            data.add(u2);
//            return JsonResult.ok(data);
//        }
        return null;
    }

    public JsonResult loadBuildingList(String communityId) {
        if(StringUtils.isEmpty(communityId)){
            return JsonResult.error("小区不存在");
        }
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("loadBuildingList");
        HashMap<String, String> map = new HashMap<>();
        map.put("communityId",communityId);
        cfg.setArgs(map);
        JsonResult result = businessDelegate.invoke(cfg);
        if (result.getSuccess()) {
            if(result.getData() == null){
                return JsonResult.ok(null);
            }
            List<BuildingVo> buildingVos = JSON.parseArray(toJSONString(result.getData()), BuildingVo.class);
            for(BuildingVo buildingVo : buildingVos){
                String unitData = buildingVo.getUnitData();
                buildingVo.setData(JSON.parseArray(unitData,UnitInfo.class));
            }
            return JsonResult.ok(buildingVos);
        }
//        else {
//            List<BuildingInfo> data = new ArrayList<>();
//            BuildingInfo buildingInfo1 = new BuildingInfo("1","1栋");
//            BuildingInfo buildingInfo2 = new BuildingInfo("2","2栋");
//            UnitInfo unitInfo1 = new UnitInfo("1","1栋1单元");
//            UnitInfo unitInfo2 = new UnitInfo("2","1栋2单元");
//            List<UnitInfo> unitInfoList1 = new ArrayList<>();
//            unitInfoList1.add(unitInfo1);
//            unitInfoList1.add(unitInfo2);
//            buildingInfo1.setData(unitInfoList1);
//            UnitInfo unitInfo3 = new UnitInfo("3","2栋1单元");
//            UnitInfo unitInfo4 = new UnitInfo("4","2栋2单元");
//            List<UnitInfo> unitInfoList2 = new ArrayList<>();
//            unitInfoList2.add(unitInfo3);
//            unitInfoList2.add(unitInfo4);
//            buildingInfo2.setData(unitInfoList2);
//            data.add(buildingInfo1);
//            data.add(buildingInfo2);
//            return JsonResult.ok(data);
//        }
        return null;
    }

    public JsonResult remoteOpenDoor(String serialNum,String productCode) {
        if(StringUtils.isEmpty(serialNum)){
            return JsonResult.error("设备序列号不存在");
        }
        JsonResult jr = parseResult("M16", "remoteOpened", "{}", "down",productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult result = controlDevice(serialNum, downResult);
                log.info("remoteOpenDoor: " + result.toString());
                if (result.getSuccess()) {
                    log.info("远程开门: "+ result.getData().toString());
                    if(CommonUtil.isSucceed(result.getData().toString())){
                        //新增开门记录
                        CdzxkacsOpenRecord openRecord = new CdzxkacsOpenRecord();
                        openRecord.setId(StringUtil.getUuid());
                        openRecord.setSerialNum(serialNum);
                        HashMap param = new HashMap();
                        param.put("serialNum",serialNum);
                        CdzxkacsDevice deviceInfo = deviceMapper.selectOne(param);
                        if(deviceInfo != null){
                            openRecord.setCommunityId(deviceInfo.getCommunityId());
                            openRecord.setCommunityName(deviceInfo.getCommunityName());
                            openRecord.setDeviceName(deviceInfo.getDeviceName());
                        }
                        openRecord.setOpenTime(LocalDateTime.now());
                        openRecord.setOpenType("远程开门");
                        SysUserVO currentUser = getCurrentUser();
                        if(currentUser != null){
                            openRecord.setOpenUserId(currentUser.getUserId());
                            openRecord.setOpenUser(currentUser.getUserAccount());
                            openRecord.setPhone(currentUser.getUserCellphoneNo());
                        }
                        openRecordMapper.insert(openRecord);
                        return JsonResult.ok("远程开门成功",result.getData());
                    }
                    return JsonResult.error(CommonUtil.getErrorMsgByResult(result.getData().toString()));
                }else {
                    return JsonResult.error("开门失败");
                }
            }
        }
        return JsonResult.error("开门失败");
    }

    // 人员库查询(不用查) 当前仅支持的库ID有3（默认员工库id）和4（默认访客库）
    private JsonResult findPersonLibInfo(String serialNum,String productCode) {
        return null;
    }

    // 下行-人员新增或修改
    public JsonResult personCreateOrUpdate(String persionLibraryId, String serialNum, String productCode, CdzxkacsUser userInfo) {
        if(StringUtils.isEmpty(persionLibraryId) || StringUtils.isEmpty(serialNum) || StringUtils.isEmpty(productCode)
            || StringUtils.isEmpty(userInfo) ){
            return JsonResult.error("参数错误");
        }
        JSONObject pJsonObj = new JSONObject();
        pJsonObj.put("persionLibraryId",persionLibraryId);
        Map<String,Object> paramsMap = new HashMap<>();
        paramsMap.put("Num",1);
        JSONArray jsonArray = new JSONArray();
        JSONObject p3JsonObj = new JSONObject();
        String funCmd = "personCreate",funcCode = "M4";
        String infoId = userInfo.getId();
        if(!StringUtils.isEmpty(infoId)){
            funCmd = "personModify";
            funcCode = "M5";
        }
        String personId = !StringUtils.isEmpty(infoId) ? infoId :redisUtil.getIncre("personId")+"";
        p3JsonObj.put("PersonID",personId);// 新增可以不填
        p3JsonObj.put("LastChange",System.currentTimeMillis()/1000);
        p3JsonObj.put("PersonCode",userInfo.getPersonCode());
        p3JsonObj.put("PersonName",userInfo.getName());
        p3JsonObj.put("Remarks",userInfo.getMark());
        String templateArrStr = userInfo.getTimeTemplate();
        JSONArray templateArr = JSONArray.parseArray(templateArrStr);
        if(templateArr != null && templateArr.size() > 0){
            p3JsonObj.put("TimeTemplateNum",templateArr.size());
            JSONArray ttJsonArr = new JSONArray();
            for (int i = 0; i < templateArr.size(); i++) {
                JSONObject obj = templateArr.getJSONObject(i);
                String templateId = obj.getString("id");
                JSONObject ttJson = new JSONObject();
                ttJson.put("BeginTime",0);
                ttJson.put("EndTime",4294967295L);
                ttJson.put("Index",templateId);
                ttJsonArr.add(ttJson);
                // 根据时间模板id查询时间模板id索引
//                JsonResult templateInfo = findOneTimeTemplates(templateId, serialNum, productCode);
//                if(templateInfo != null && templateInfo.getSuccess()){
//                    JSONObject jsonObject = JSONObject.parseObject(templateInfo.getData().toString());
//                    Integer responseCode = jsonObject.getInteger("ResponseCode");
//                    if(responseCode != null && responseCode == 0){
//                        String templateIndex = jsonObject.getString("ID");//模板id索引
//                        JSONObject ttJson = new JSONObject();
//                        ttJson.put("BeginTime",0);
//                        ttJson.put("EndTime",4294967295L);
//                        ttJson.put("Index",templateIndex);
//                        ttJsonArr.add(ttJson);
//                    }
//                }
            }
            p3JsonObj.put("TimeTemplateList",ttJsonArr);
        }else {
            JSONArray ttJsonArr = new JSONArray();
            JSONObject ttJson = new JSONObject();
            ttJson.put("BeginTime",0);
            ttJson.put("EndTime",4294967295L);
            ttJson.put("Index",0);
            ttJsonArr.add(ttJson);
            p3JsonObj.put("TimeTemplateList",ttJsonArr);
            p3JsonObj.put("TimeTemplateNum",0);
        }
        p3JsonObj.put("IdentificationNum",1);//证件信息个数
        JSONArray idJsonArr = new JSONArray();
        JSONObject idJson = new JSONObject();
        idJson.put("Type",userInfo.getCertificateType());
        idJson.put("Number",userInfo.getCertificateNum());
        idJsonArr.add(idJson);
        p3JsonObj.put("IdentificationList",idJsonArr);//成员证件信息
        JSONArray faceJsonArr = new JSONArray();
        JSONObject faceJson = new JSONObject();
        if(StringUtils.isEmpty(userInfo.getFaceData())){
            p3JsonObj.put("ImageNum",0);
            faceJson.put("FaceID",0);
            faceJson.put("Name","");
            faceJson.put("Size",0);
            faceJson.put("Data","");
        }else {
            p3JsonObj.put("ImageNum",1);//人脸图片个数 暂时只支持一张
            String faceId = !StringUtils.isEmpty(userInfo.getFaceId()) ? userInfo.getFaceId() :redisUtil.getIncre("faceId")+"";
            faceJson.put("FaceID", faceId);
            faceJson.put("Name",personId+"_"+faceId+".jpg");
            String imgData = userInfo.getFaceData().replace(Constant.IMG_BASE64_PREFIX,"");
            faceJson.put("Size",imgData.length());
            faceJson.put("Data", URLEncoder.encodeURIComponent(imgData));//这里是必须的
        }
        faceJsonArr.add(faceJson);
        p3JsonObj.put("ImageList",faceJsonArr);//照片信息
        jsonArray.add(p3JsonObj);
        paramsMap.put("PersonInfoList",jsonArray);
        pJsonObj.put("persionInfo",JSON.toJSONString(paramsMap).replace("\\\\",""));
        JsonResult jr = parseResult(funcCode, funCmd, pJsonObj.toJSONString(), "down",productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult result = controlDevice(serialNum, downResult);
                log.info("控制新增人员返回："+result.toString());
                if (result.getSuccess()) {
                    String upParams = result.getData().toString();
                    if(CommonUtil.isSucceed(upParams)){
                        // 人员新增是否成功，需确认返回参数中ResultCode（处理结果状态码）字段是否为0
                        if(isCreateUserSucceed(upParams)){
                            return JsonResult.ok("人员新增成功",result.getData());
                        }
                        return JsonResult.error("人员新增失败,原因是："+ getCreUserErrMsgByResult(upParams));
                    }
                    JSONObject jsonObject = JSON.parseObject(upParams);
                    String errorMsg = jsonObject != null ? jsonObject.getString("message") : "未知";
                    return JsonResult.error("人员新增失败,原因是："+ errorMsg);
                }else {
                    return JsonResult.error("设备控制错误,人员新增失败");
                }
            }
        }
        return JsonResult.error("人员新增失败");
    }
    private boolean isCreateUserSucceed(String result){
        if(StringUtils.isEmpty(result)){return false;}
        JSONObject returnJson = JSONObject.parseObject(result);
        JSONObject responseJson = JSONObject.parseObject(returnJson.getString("r1"));
        if(responseJson == null){
            return false;
        }
        JSONObject response = responseJson.getJSONObject("Response");
        JSONObject dataJson = response.getJSONObject("Data");
        if(dataJson == null){return false;}
        int num = dataJson.getInteger("Num");
        if(num == 0){return false;}
        JSONArray personList = dataJson.getJSONArray("PersonList");
        JSONObject jsonObject = personList.getJSONObject(0);
        int faceNum = jsonObject.getInteger("FaceNum");
        if(faceNum == 0){return false;}
        JSONArray faceList = jsonObject.getJSONArray("FaceList");
        JSONObject faceJson = faceList.getJSONObject(0);
        Integer resultCode = faceJson.getInteger("ResultCode");
        return resultCode != null && resultCode == 0;
    }

    private String getCreUserErrMsgByResult(String result){
        //{"code":"0","r1":"{\"Response\": {\t\"ResponseURL\": \"/LAPI/V1.0/PACS/Controller/RemoteOpened\",\t\"CreatedID\": -1, \t\"ResponseCode\": 0, \t\"SubResponseCode\": 0, \t\"ResponseString\": \"Succeed\",\t\"StatusCode\": 0,\t\"StatusString\": \"Succeed\",\t\"Data\": \"null\"\t}}"}
        if(StringUtils.isEmpty(result)){return "";}
        JSONObject returnJson = JSONObject.parseObject(result);
        JSONObject responseJson = JSONObject.parseObject(returnJson.getString("r1"));
        if(responseJson == null){return "";}
        JSONObject response = responseJson.getJSONObject("Response");
        Integer statusCode = response.getInteger("StatusCode");
        if(statusCode != null && statusCode != 0){
            return ResultCode.getDesc(statusCode);
        }
        JSONObject dataJson = response.getJSONObject("Data");
        if(dataJson == null){return "";}
        int num = dataJson.getInteger("Num");
        if(num == 0){return "";}
        JSONArray personList = dataJson.getJSONArray("PersonList");
        JSONObject jsonObject = personList.getJSONObject(0);
        int faceNum = jsonObject.getInteger("FaceNum");
        if(faceNum == 0){return "";}
        JSONArray faceList = jsonObject.getJSONArray("FaceList");
        JSONObject faceJson = faceList.getJSONObject(0);
        Integer resultCode = faceJson.getInteger("ResultCode");
        if(resultCode == null){return "";}
        return ResultCode.getDesc(resultCode);
    }

    // 下行-人员删除
    public JsonResult personDelete(String persionLibraryId, String serialNum, String productCode, String personId) {
        if(StringUtils.isEmpty(persionLibraryId) || StringUtils.isEmpty(serialNum) || StringUtils.isEmpty(productCode)
                || StringUtils.isEmpty(personId) ){
            return JsonResult.error("参数错误");
        }
        JSONObject pJsonObj = new JSONObject();
        pJsonObj.put("persionLibraryId",persionLibraryId);
        pJsonObj.put("persionId",personId);
        // 这个是真的坑 不转成String类型就不行
        pJsonObj.put("lastModifiedTime",System.currentTimeMillis()/1000+"");
        JsonResult jr = parseResult("M6", "personDelete", pJsonObj.toJSONString(), "down",productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult result = controlDevice(serialNum, downResult);
                log.info("控制删除人员： "+ result.toString());
                if (result.getSuccess()) {
                    // 根据ResponseCode是否为0判断成功与否
                    String resultStr = result.getData().toString();
                    if(CommonUtil.isSucceed(resultStr)){
                        return JsonResult.ok("人员删除成功",result.getData());
                    }
                    return JsonResult.error("人员删除失败: " + CommonUtil.getErrorMsgByResult(resultStr));
//                    JsonResult jsonResult = parseResult("M21-M4-M5-M6-M7", "replyPersonManipulation", result.getData().toString(), "up", productCode);
//                    if(jsonResult != null && jsonResult.getSuccess()){
//                        JSONObject jsonObject = JSONObject.parseObject(jsonResult.getData().toString());
//                        Integer responseCode = jsonObject.getInteger("ResponseCode");
//                        if(responseCode != null && responseCode == 0){
//                            return JsonResult.ok("人员删除成功",result.getData());
//                        }else {
//                            return JsonResult.error("人员删除失败");
//                        }
//                    }
                }else {
                    return JsonResult.error("人员删除失败");
                }
            }
        }
        return JsonResult.error("人员删除失败");
    }
    // 下行-时间模板信息单个查询
    public JsonResult findOneTimeTemplates(String timeTemplateId, String serialNum, String productCode) {
        if(StringUtils.isEmpty(timeTemplateId) || StringUtils.isEmpty(serialNum) ||
                StringUtils.isEmpty(productCode)){
            return JsonResult.error("参数错误");
        }
        JSONObject pJsonObj = new JSONObject();
        pJsonObj.put("timeTemplateId",timeTemplateId);
        JsonResult jr = parseResult("M8", "findOneTimeTemplates", pJsonObj.toJSONString(), "down",productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult result = controlDevice(serialNum, downResult);
                log.info("时间模板信息单个查询： "+ result.toString());
                if (result.getSuccess()) {
                    String upParams = result.getData().toString();
                    if(CommonUtil.isSucceed(upParams)){
                        JsonResult upJsonResult = parseResult("M22-M8-M9-M10-M11-M12", "replyTimeTemplatesManipulation", upParams, "up", productCode);
                        if(upJsonResult != null && upJsonResult.getSuccess()){
                            log.info("时间模板信息单个查询： "+ upJsonResult.getData().toString());
                            return JsonResult.ok("时间模板信息查询成功",upJsonResult.getData());
                        }
                    }
                    return JsonResult.error(CommonUtil.getErrorMsgByResult(upParams));
                }
                return JsonResult.error("查询时间模板失败");
            }
        }
        return JsonResult.error("查询时间模板失败");
    }

    private String parseTimeSlot(int num){
        if(num < 10){
            return "0"+num;
        }else if(num >= 24){
            return "00";
        }else {
            return num+"";
        }
    }

    //下行-时间模板信息的新增或修改
    public JsonResult createOrUpdateTimeTemplates(String serialNum, String productCode,
                                          CdzxkacsTimeTempalte record, JSONObject jsonObject, JSONArray exTimeArr,boolean isUpdate) {
        if(StringUtils.isEmpty(serialNum) || StringUtils.isEmpty(jsonObject) ||
                StringUtils.isEmpty(productCode) || StringUtils.isEmpty(record)){
            return JsonResult.error("参数错误");
        }
        String funCmd = "createTimeTemplates",funcCode = "M10";
        if(isUpdate){
            funCmd = "modifyTimeTemplates";
            funcCode = "M11";
        }
        Map<String,Object> pJsonObjMap = new HashMap<>();
        pJsonObjMap.put("timeTemplateId",record.getId());
        Map<String,Object> paramMap = new HashMap<>();
        paramMap.put("Name",record.getName());
        paramMap.put("LastChange",System.currentTimeMillis()/1000);
        JSONObject p3JsonObj = new JSONObject();
        p3JsonObj.put("Enabled",1);
        p3JsonObj.put("Num",jsonObject.size());
        JSONArray jsonArray = new JSONArray();
        for (String keyNum : jsonObject.keySet()) {
            JSONObject p4JsonObj = new JSONObject();
            int num = Integer.parseInt(keyNum) - 1;
            JSONArray jsonArr = jsonObject.getJSONArray(keyNum);
            p4JsonObj.put("ID",num);//星期索引：注意是从从0开始
            JSONArray jsonArr2 = new JSONArray();
            if(jsonArr.size() == 1){
                JSONObject p5JsonObj = new JSONObject();
                int beginSlot = (Integer) jsonArr.get(0);
                p5JsonObj.put("Begin",parseTimeSlot(beginSlot)+":00:00");
                p5JsonObj.put("End",parseTimeSlot(beginSlot)+":59:59");
                p5JsonObj.put("ArmingType",0); //默认定时类型
                jsonArr2.add(p5JsonObj);
            }else {
                List<Integer> timeSlotList = new ArrayList<>();
                for (int i = 0; i < jsonArr.size(); i++) {
                    int timeSlot = (Integer) jsonArr.get(i);
                    timeSlotList.add(timeSlot);
                }
                // 排序,用户先点击后面的再点击前面的会出现这种情况
                Collections.sort(timeSlotList);
                for (int i = 0; i < timeSlotList.size(); i++) {
                    int begin = timeSlotList.get(i);
                    int end = begin;
                    int step = 0;
                    if(timeSlotList.contains((begin+1))){
                        for (int j = i+1; j < timeSlotList.size(); j++) {
                            int b = timeSlotList.get(j);
                            if((b-end==1)){
                                end = b;
                                step++;
                            }else {
                                break;
                            }
                        }
                    }
                    i = i + step;
                    JSONObject p5JsonObj = new JSONObject();
                    p5JsonObj.put("Begin",parseTimeSlot(begin)+":00:00");
                    p5JsonObj.put("End",parseTimeSlot(end)+":59:59");
                    p5JsonObj.put("ArmingType",0); //默认定时类型
                    jsonArr2.add(p5JsonObj);
                }
            }
            p4JsonObj.put("Num",jsonArr2.size());
            p4JsonObj.put("TimeSectionInfos",jsonArr2);
            jsonArray.add(p4JsonObj);
        }
        p3JsonObj.put("Days",jsonArray);
        paramMap.put("WeekPlan",p3JsonObj);
        if(exTimeArr != null && exTimeArr.size() > 0){
            JSONObject exObj = new JSONObject();
            exObj.put("Enabled",1);
            exObj.put("Num",exTimeArr.size());
            JSONArray exArr = new JSONArray();
            for (int i = 0; i < exTimeArr.size(); i++) {
                JSONObject obj = exTimeArr.getJSONObject(i);
                String exDate =  obj.getString("id");
                JSONObject exObj2 = new JSONObject();
                exObj2.put("ID",i);//例外日期索引:从0开始
                exObj2.put("Enabled",1);
                exObj2.put("Date",exDate);
                exObj2.put("Num",1); //一天的所有时段，一个时段
                JSONArray exArr2 = new JSONArray();
                JSONObject exObj3 = new JSONObject();
                exObj3.put("Begin","00:00:00");
                exObj3.put("End","23:59:59");
                exObj3.put("ArmingType",0);
                exArr2.add(exObj3);
                exObj2.put("TimeSectionInfos",exArr2);
                exArr.add(exObj2);
            }
            exObj.put("ExceptionDays",exArr);
            paramMap.put("Exception",exObj);
        }
        // 涉及到复杂json对象的最好是这样做
        pJsonObjMap.put("templateInfo",JSON.toJSONString(paramMap).replace("\\\\",""));
        JsonResult jr = parseResult(funcCode, funCmd, JSON.toJSONString(pJsonObjMap), "down",productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult result = controlDevice(serialNum, downResult);
                log.info("控制时间模板新增： "+ result.toString());
                String resultStr = result.getData().toString();
                if (result.getSuccess()) {
                    if(CommonUtil.isSucceed(resultStr)){
                        return JsonResult.ok("时间模板新增成功");
                    }
                }
                return JsonResult.error("时间模板新增失败: " + CommonUtil.getErrorMsgByResult(resultStr));
            }
        }
        return JsonResult.error("时间模板新增失败");
    }

    //下行-时间模板信息的删除
    public JsonResult deleteTimeTemplates(String id,String serialNum, String productCode) {
        if(StringUtils.isEmpty(id) || StringUtils.isEmpty(serialNum) || StringUtils.isEmpty(productCode) ){
            return JsonResult.error("参数错误");
        }
        String funCmd = "deleteTimeTemplates",funcCode = "M12";
        JSONObject pJsonObj = new JSONObject();
        pJsonObj.put("timeTemplateId",id);
        JsonResult jr = parseResult(funcCode, funCmd, pJsonObj.toJSONString(), "down",productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult result = controlDevice(serialNum, downResult);
                log.info("控制时间模板删除： "+ result.toString());
                if (result.getSuccess()) {
                    if(CommonUtil.isSucceed(result.getData().toString())){
                        return JsonResult.ok("时间模板删除成功",result.getData());
                    }
                }
                return JsonResult.error("时间模板删除失败: " + CommonUtil.getErrorMsgByResult(result.getData().toString()));
            }
        }
        return JsonResult.error("时间模板删除失败");
    }

    private JsonResult controlDevice(String serialNum, ParsedDownResult downResult) {
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("controlDevice");
        Map<String, Object> map = new HashMap<>();
        map.put("operation", downResult.getOperation());
        map.put("serialNum", serialNum);
        String controlParams = downResult.getControlParams();
        map.put("controlParams", controlParams);
        cfg.setArgs(map);
        log.info("控制设备的参数: " + controlParams);
        return businessDelegate.invoke(cfg);
    }

    /**
     * 应用请求解析下行或上行
     * @param funcCode 应用产品编号 00073601
     * @param funcCmd 应用功能指令 如M1
     * @param controlParams 下行或下行控制参数
     * @param type down 下行 up 上行
     * @return
     */
    public JsonResult parseResult(String funcCode, String funcCmd, String controlParams, String type, String productCode){
        log.info("parseResult===== funcCode: " + funcCode + ", funcCmd: " + funcCmd + ", controlParams: " + controlParams);
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("parseResult");
        Map<String, Object> argsMap = setCommonArgsMap();
        argsMap.put("funcCode",funcCode);
        argsMap.put("productCode",productCode);
        argsMap.put("funcCmd",funcCmd);
        JSONObject paramJson = JSONObject.parseObject(controlParams);
        if("down".equals(type)){
            argsMap.put("controlParams",paramJson);
        }else if("up".equals(type)){
            argsMap.put("resultContent",paramJson);
        }else if("report".equals(type)){
            argsMap.put("reportMessage",paramJson);
            argsMap.put("cmd_name",funcCmd);
            argsMap.remove("funcCode");
            argsMap.remove("funcCmd");
        }
        cfg.setArgs(argsMap);
        log.info("parseResult argsMap: " + argsMap.toString());
        JsonResult result = businessDelegate.invoke(cfg);
        log.info("parseResult: funcCmd " +funcCmd + ". Result: " + result.toString());
        if (result !=null && result.getSuccess()) {
            return result;
        }
        return null;
    }

    private Map<String, Object> setCommonArgsMap(){
        HashMap<String, Object> argsMap = new HashMap<>();
        argsMap.put("appCode",Constant.APP_CODE);
        argsMap.put("appVersion",Constant.APP_VERSION);
        return argsMap;
    }

    public JsonResult syncDeviceData() {
        InvokeCfg cfg = new InvokeCfg();
        cfg.setModuleKey(Constant.MODULE_KEY);
        cfg.setClassName(Constant.MODULE_CLASS_NAME);
        cfg.setFunName("syncDeviceData");
        Map<String, String> argsMap = new HashMap<>();
        argsMap.put("moduleCode",Constant.MODULE_KEY);
        cfg.setArgs(argsMap);
        JsonResult result = businessDelegate.invoke(cfg);
        log.info("同步设备，返回数据: " + result.toString());
        if (result.getSuccess()) {
            List<CdzxkacsDevice> deviceList = JSON.parseArray(result.getData().toString(),CdzxkacsDevice.class);
            int count = 0;
            for (CdzxkacsDevice device: deviceList){
                // 查询设备的IP地址、序列号、版本信息
                setDeviceInfo(device);
                CdzxkacsDevice device1 = deviceMapper.selectByKey(device.getId());
                if(device1 == null){
                    device.setCreateTime(LocalDateTime.now());
                    deviceMapper.insert(device);
                    count++;
                }else {
                    BeanUtils.copyProperties(device,device1);
                    device1.setDeviceName(null);//防止别名被修改
                    device1.setDeviceIp(null);
                    device1.setSystemTime(null);
                    device.setReplyVolume(null);
                    deviceMapper.updateByKey(device1);
                }
            }
            return JsonResult.ok("成功同步"+count+"条记录","");
        }else {
            return JsonResult.error("同步失败");
        }
    }

    // 获取设备在线状态 0在线1离线 9未知
    public int getDeviceStatus(String serialNum, String productCode){
        JsonResult jr = parseResult("M2", "getDevStatus", "{}", "down", productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult infoResult = controlDevice(serialNum, downResult);
                log.info("控制获取设备在线状态: " + infoResult.toString());
                if (infoResult.getSuccess()) {
                    String s = infoResult.getData().toString();
                    if(CommonUtil.isSucceed(s)){
                        return 0;
                    }
                    log.error(CommonUtil.getErrorMsgByResult(s));
                    return 9;
                }
            }
        }
        return 9;
    }

    private void setDeviceInfo(CdzxkacsDevice device) {
        JsonResult jr = parseResult("M1", "getDevInformation", "{}", "down", device.getProductCode());
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult infoResult = controlDevice(device.getSerialNum(), downResult);
                log.info("控制设备的IP地址、序列号、版本信息等: " + infoResult.toString());
                if (infoResult.getSuccess()) {
                    String s = infoResult.getData().toString();
                    if(CommonUtil.isSucceed(s)){
                        String dataStr = CommonUtil.getDataFromResult(s);
                        JSONObject dataJson = JSONObject.parseObject(dataStr);
                        device.setDeviceModel(dataJson.getString("DeviceModel"));
                        device.setDeviceIp(dataJson.getString("Address"));
                    }
                    log.error(CommonUtil.getErrorMsgByResult(s));
                }
            }
        }
    }

    public boolean createSubscription(String deviceId,String serialNum, String productCode,String ipAddress,Integer port){
        if(StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(serialNum) || StringUtils.isEmpty(productCode)
                || StringUtils.isEmpty(ipAddress) || StringUtils.isEmpty(port)){
            return false;
        }
        Map<String,Object> pJsonObjMap = new HashMap<>();
        pJsonObjMap.put("AddressType",0);//IP地址类型 0: IPv41: IPv6 当前仅支持IPV4
        pJsonObjMap.put("IPAddress",ipAddress);
        pJsonObjMap.put("Port",port);
        pJsonObjMap.put("Duration",4294967295L);
        pJsonObjMap.put("Type",1024); //订阅类型 1024:人员核验
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("LibIDNum",65535);
        jsonObj.put("LibIDList",new JSONArray());
        pJsonObjMap.put("SubscribePersonCondition",jsonObj);
        Map<String,Object> ObjMap = new HashMap<>();
        ObjMap.put("subscriptionParam",JSON.toJSONString(pJsonObjMap));
        JsonResult jr = parseResult("M13", "createSubscription", JSON.toJSONString(ObjMap), "down", productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult infoResult = controlDevice(serialNum, downResult);
                log.info("控制创建订阅: " + infoResult.toString());
                if (infoResult.getSuccess()) {
                    String s = infoResult.getData().toString();
                    if(CommonUtil.isSucceed(s)){
                        String dataStr = CommonUtil.getDataFromResult(s);
                        JSONObject dataJson = JSONObject.parseObject(dataStr);
                        String subscribeId = dataJson.getString("ID");
                        if(!StringUtils.isEmpty(subscribeId)){
                            // 更新设备的订阅id
                            CdzxkacsDevice deviceInfo = new CdzxkacsDevice();
                            deviceInfo.setId(deviceId);
                            deviceInfo.setSubscribeId(subscribeId);
                            deviceMapper.updateByKey(deviceInfo);
                            return true;
                        }
                        return false;
                    }
                    log.error(CommonUtil.getErrorMsgByResult(s));
                    return false;
                }
            }
        }
        return false;
    }

    public boolean deleteSubscription(String serialNum, String productCode,String subscribeId){
        if(StringUtils.isEmpty(serialNum) || StringUtils.isEmpty(productCode) || StringUtils.isEmpty(subscribeId)){
            return false;
        }
        Map<String,Object> pJsonObjMap = new HashMap<>();
        pJsonObjMap.put("subscriptionId",subscribeId);
        JsonResult jr = parseResult("M15", "deleteSubscription", JSON.toJSONString(pJsonObjMap), "down", productCode);
        if(jr != null && jr.getSuccess()){
            ParsedDownResult downResult = JSONObject.parseObject(jr.getData().toString(), ParsedDownResult.class);
            if(downResult != null){
                JsonResult infoResult = controlDevice(serialNum, downResult);
                log.info("控制删除订阅: " + infoResult.toString());
                if (infoResult.getSuccess()) {
                    String s = infoResult.getData().toString();
                    if(CommonUtil.isSucceed(s)){
                        return true;
                    }
                    log.error(CommonUtil.getErrorMsgByResult(s));
                    return false;
                }
            }
        }
        return false;
    }

//    public JsonResult updateDeviceStatus() {
//        List<CdzxkacsDevice> list = deviceMapper.list(new HashMap());
//        for (CdzxkacsDevice device : list){
//            InvokeCfg cfg = new InvokeCfg();
//            cfg.setModuleKey(Constant.MODULE_KEY);
//            cfg.setClassName(Constant.MODULE_CLASS_NAME);
//            cfg.setFunName("selectDeviceStatus");
//            Map<String, String> argsMap = new HashMap<>();
//            argsMap.put("id",device.getId());
//            cfg.setArgs(argsMap);
//            JsonResult result = businessDelegate.invoke(cfg);
//            log.info("更新设备状态: " + result.toString());
//            if (result.getSuccess()) {
//                CdzxkacsDevice deviceInfo = JSON.parseObject(result.getData().toString(),CdzxkacsDevice.class);
//                if(deviceInfo != null){
//                    deviceMapper.updateByKey(deviceInfo);
//                }
//                return JsonResult.ok("更新设备成功");
//            }else {
//                return JsonResult.error("查询设备失败");
//            }
//        }
//        return JsonResult.error("未查询到相关设备");
//    }


}
